// 导入 axios 库以及 Axios 相关的类型定义
// axios 是一个基于 Promise 的 HTTP 客户端，可用于浏览器和 Node.js 环境
// AxiosResponse 用于定义 Axios 响应对象的类型
// AxiosRequestConfig 用于定义 Axios 请求配置对象的类型
import axios, { AxiosResponse, AxiosRequestConfig } from "axios";

/**
 * 创建一个自定义的 Axios 实例
 * 通过 axios.create() 方法创建一个新的 Axios 实例，这样可以对该实例进行独立的配置，
 * 不会影响全局的 Axios 配置。
 */
const service = axios.create();

/**
 * 请求拦截器 * 使用 service.interceptors.request.use() 方法为请求拦截器添加处理函数。
 * 该拦截器会在请求发送之前被调用，可以对请求配置进行修改。
 */
service.interceptors.request.use(
  // 请求成功时的拦截处理函数
  (config: AxiosRequestConfig) => {
    // 在这里可以添加一些请求前的处理逻辑，例如添加请求头
    // 示例：config.headers['Authorization'] = 'Bearer token';
    // 最后必须返回修改后的请求配置对象
    return config;
  },
  // 请求失败时的拦截处理函数
  (error: any) => {
    // 当请求发生错误时，使用 Promise.reject() 将错误传递下去
    return Promise.reject(error);
  },
);

/**
 * 响应拦截器
 * 使用 service.interceptors.response.use() 方法为响应拦截器添加处理函数。
 * 该拦截器会在响应返回之后被调用，可以对响应数据进行处理。
 */
service.interceptors.response.use(
  // 响应成功时的拦截处理函数
  async (response: AxiosResponse) => {
    // 在这里可以添加一些响应成功后的处理逻辑，例如处理响应数据、检查状态码等
    // 示例：如果响应状态码不是 200，抛出错误
    // if (response.status !== 200) {
    //     return Promise.reject(new Error('请求失败'));
    // }
    // 最后返回处理后的响应对象或响应数据
    return response;
  },
  // 响应失败时的拦截处理函数
  (error: any) => {
    // 当响应发生错误时，使用 Promise.reject() 将错误传递下去
    return Promise.reject(error);
  },
);

// 导出创建好的 Axios 实例，以便在其他模块中使用
export default service;
